package com.zbj.homemade.spring;

import com.zbj.homemade.spring.lifecycle.BeanPostProcessor;

/**
 * @program: principle
 * @description:
 *
 *      不做任何多线程处理，因为麻烦。。。。
 *
 *      Bean工厂，故名思意，负责bean的产生与获取,spring ioc容器中最顶级的接口，
 *      在架构设计中，将主要类设计为接口而不是抽象类的原因:
 *      1.抽象类abstract 遵循模式是: is-A,即继承我则一定是我，而接口类只负责描述行为 like-A,即实现我，则跟我相似，拥有同样
 *      行为
 *      2.接口更具有一般通用行为,在对象调用中，我知道你的行为即可调用，至于你内部属性，在外部知晓的越少越好.
 *      3.接口设计一般自顶而下，抽象类等基类一般自底而上
 *
 * ★ 此处只实现最关键的bean工厂行为，即spring最关键的行为之一，获取bean，所有的DI（依赖注入，都不过是从容器中获取，而后，
 *    实例化注入对象，等待使用者在某一个时机注入）
 * ★
 * @author: Yinn
 * @create: 2019-02-28 15:48
 **/
public interface BeanFactory {

    /**
     * 通过类加载器获取bean
     */
    <T> T getBean(Class<T> cls);

    /**
     * 通过名称获取bean
     */
    Object getBean(String beanName);

    /**
     * 隶属于 可配置式bean工厂, 添加bean后置处理器, 在bean工厂实例化之后执行(填充一些内部处理器)
     */
    void addBeanPostProcessor(BeanPostProcessor postProcessor);

//    /**
//     * 预制所有单例非懒加载对象
//     */
//    void preInstantiateSingletons();
}
